<?php
require_once('LoginModel.php');
require_once('Database.php');
require_once('DBConfig.php');
require_once('User.php');
require_once('\Common\Validator.php');
require_once('\Models\UserRegister.php');
require_once('\Models\ManageUsersModel.php');

class Tests
{
	/**
	 * Testar inloggningsfunktioner
	 */
	public static function TestLoginModel()
	{
		$output = array();
		$lm = new LoginModel();
		
		// Börjar med att logga ut
		$lm->Logout();
		
		// Om vi fortfarande är inloggade är IsLoggedIn felimplementerad
		if($lm->IsLoggedIn() == true)
			$output[] = "FEL 1: Användaren är fortfarande inloggad trots att den loggats ut";	
		
		// Om inloggning med felaktiga uppgifter lyckas är Login felimplementerad
		if($lm->Login("admin", "1234") == true)
			$output[] = "FEL 2: Inloggning lyckades med felaktiga parametrar";
		
		// Om inloggning med rätt uppgifter misslyckas är Login felimplementerad
		if($lm->Login("admin", "admin1234") == false)
			$output[] = "FEL 3: Inloggning misslyckades med korrekta parametrar";
		
		// Ifall vi fortfarande inte är inloggade
		if($lm->IsLoggedIn() == false)
			$output[] = "FEL 4: Användaren är fortfarande inte inloggad efter försök med korrekta parametrar";
		
		// Eka ut felmeddelanden
		foreach ($output as $p)
			echo "<p>$p</p>";
		
		// Om det finns felmeddelanden har testet ej gått igenom
		if(count($output) > 0)
			return false;
		else
			return true;
	}

	/**
	 * Testar databasuppkoppling
	 */
	public static function TestDatabase()
	{
		$db = new Database();
		$output = array();
		
		if ($db->Connect(new DBConfig()) == false)
			$output[] = "FEL: Databaskopplingen misslyckades";
		
		$nrOfPostBefore = $db->SelectOne("SELECT COUNT(*) FROM login");
		
		// Skapa unik användare för att inte få undantag kastade
		$statement = $db->Prepare("INSERT INTO login(user,password) VALUES ('user".time()."','testing1234')");
		
		$db->Insert($statement);
		
		$nrOfPostAfter = $db->SelectOne("SELECT COUNT(*) FROM login");
		
		if ($nrOfPostBefore +1 != $nrOfPostAfter)
			$output[] = "FEL: Prepare eller Insert misslyckades";
		
		if ($db->SelectOne("SELECT COUNT(*) FROM login") == 0)
			$output[] = "FEL: Misslyckades med att välja en rad ur databasen";
		
		if ($db->Close() == false)
			$output[] = "FEL: Kunde inte stänga databasuppkopplingen";
		
		foreach ($output as $p)
			echo "<p>$p</p>";
		
		if(count($output)>0)
			return false;
		else
			return true;
	}
	
	/**
	 * Testar registrering av ny användare
	 */
	public static function TestUser()
	{
		$output = array();
		
		if(Validator::validateNumber("ett"))
			$output[] = "FEL: Ett icke-nummer valideras korrekt som nummer.";
	
		if(!Validator::validateNumber(1))
			$output[] = "FEL: Ett korrekt nummer valideras inkorrekt";
		
		if(!Validator::validatePassword("admin1234", 6))
			$output[] = "FEL: Ett korrekt lösenord validerades ej";
		
		if(Validator::validatePassword("admin", 6))
			$output[] = "FEL: Ett för kort lösenord validerades korrekt";
		
		if(Validator::validateUserName(""))
			$output[] = "FEL: Ett felaktigt användarnamn validerades ok";
		
		if(!Validator::validateUserName("admin"))
			$output[] = "FEL: Korrekt användarnamn validerades ej";
		
		$user = new User("test","admin");
		if($user->isValid)
			$output[] = "FEL: Objektet innehåller fel och ska ej vara valit";
		
		$user = NULL;
		$user = new User("1","admin");
		if(!$user->isValid)
			$output[] = "FEL: Objektet är inte valit trots det initierats med korrekta parametrar";
		
		foreach ($output as $p)
			echo "<p>$p</p>";
		
		if(count($output)>0)
			return false;
		else
			return true;
	}
	
	/**
	 * Testar hämtning av användarregister
	 */
	public static function TestUserRegister(Database $db)
	{
		$output = array();
		$ur = new UserRegister();
		
		if ($db->Connect(new DBConfig()) == false)
			$output[] = "FEL: Databaskopplingen misslyckades";
			
		$allUsers = $ur->getUsers($db);
		
		if(get_class($allUsers) != "UserArray")
			$output[] = "FEL: UserRegister->getUsers() returnerade " . get_class($allUsers);
			
		foreach ($output as $p)
			echo "<p>$p</p>";
		
		if(count($output)>0)
			return false;
		else
			return true;
	}
	
	/**
	 * Testar användarhanteringsmodulen
	 */
	public static function TestManageUsersModel(Database $db)
	{
		$output = array();
		
		if ($db->Connect(new DBConfig()) == false)
		{
			echo "<p>FEL: Databaskopplingen misslyckades</p>";
			return false;
		}
		
		$mum = new ManageUsersModel($db);
		
		// Lägg till befintlig användare
		$errors = $mum->createUser('test', 'testing1234', 'testing1234', 6);
		
		if(count($errors) == 0)
			$output[] = "FEL: Det gick att lägga till en användare vars namn redan finns redan i DB";
		
		// Ta bort användare
		if(!$mum->deleteUser("",'test'))
			$output[] = "FEL: Det gick inte att ta bort användaren test ur DB";
		
		if($mum->userExists('test'))
			$output[] = "FEL: Användaren test finns i DB efter borttagning";
		
		// Lägg till test-användaren igen
		$errors = $mum->createUser('test', 'testing1234', 'testing1234', 6);
		
		if(count($errors)>0)
			$output[] = "FEL: Det gick inte att lägga till en användare i DB";
		
		// Skriv ut felmeddelanden
		foreach ($output as $p)
			echo "<p>$p</p>";
		
		if(count($output)>0)
			return false;
		else
			return true;
	}
}

?>